package com.sicheng.lc.lc笔试.美团篇;

import java.util.Scanner;
import java.util.TreeSet;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/8/20 11:16
 */
public class 选择物品满足条件所消耗的最小代价 {
    /**
     * 小团的玩具火箭有点磨损了，上面有很多地方翘起来了，
     * 小团想要用强力胶进行修补，但在强力胶凝结之前，需要找点东西压住。幸好小团有很多这样的东西。
     * 小团有m种配重材料，第i种材料重ai单位重量（因为小团有太多了，可以认为每种都有任意多个）。
     * 火箭上有n个地方翘起来了，需要至少bi单位重量的东西来压住，而且只能用一个配重材料来压，
     * (多了的话不好压，多个配重材料容易散开，所以小团不想用多个来折腾)。小团想一次就把所有翘起来的地方全都修补好，
     * 请问他需要使用的配重材料重量之和最少是多少？
     * <p>
     * 输入描述
     * 第一行两个正整数n和m，分别代表需要修补的地方个数以及材料种类数。
     * <p>
     * 接下来一行n个数b1,b2,...,bn，含义如题。
     * <p>
     * 接下来一行m个数 a1,a2,...,am，含义如题。
     * <p>
     * 对于40%的数据，n,m≤100
     * <p>
     * 对于另外30%的数据，n,m≤2000
     * <p>
     * 对于所有数据，1≤n,m≤50000，1≤ai,bi≤104
     * <p>
     * 输出描述
     * 输出小团最少需要使用的配重材料重量之和。如果没有任何办法满足，输出-1
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[] b = new int[n];
        TreeSet<Integer> tree = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            b[i] = sc.nextInt();
        }

        for (int i = 0; i < m; i++) {
            tree.add(sc.nextInt());
        }

        int res = 0;
        // NlogN
        for (int i = 0; i < n; i++) {
            int x = b[i];
            // 至少需要重x的材料
            // 红黑树找到 大于x的最小元素 找不到就无法修补
            Integer y = tree.ceiling(x);
            if (y == null) {
                System.out.println(-1);
                return;
            }

            res += y;

        }
        System.out.println(res);
    }
}
